# -*- coding:utf-8 -*-
import re
# import sys
# reload(sys)
# sys.setdefaultencoding('utf8')
from companyName_2 import startEnd,companySuffix
import zipstream
import os

gdict={u'零':'0',u'壹':'1',u'贰':'2',u'叁':'3',u'肆':'4',u'伍':'5',u'陆':'6',u'柒':'7',u'捌':'8',u'玖':'9'}

ddict={u'一':'1',u'二':'2',u'三':'3',u'四':'4',u'五':'5',u'六':'6',u'七':'7',u'八':'8',u'九':'9'}

qqPattern=r'([1-9]\d{4,10})'

weichatPattern=r'([a-zA-Z]{1}[-_a-zA-Z0-9]{5,19}|1\d{10})'

# emailPattern=r'(\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b)'
emailPattern=ur'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z\u4e00-\u9fa5]{2,4})'

urlPattern=r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,])+|(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*,])+'
# urlPattern=r'(http[s]?://[a-zA-Z0-9-_&+!*,]+)|([a-zA-Z0-9-_&+!*,]+)'
flagChengDui=[('（','）'),('(',')'),('[',']'),('{','}'),('"','"'),("'","'"),('<','>'),(u'《',u'》'),(u'【',u'】')]

weiboPattern=u'(@[a-zA-Z0-9\u4e00-\u9fa5]+)'

mobilphonePattern=r'(1\d{10})'


# telphonePattern=r'(800[-]?\d{3,4}[-]?\d{3,4}|400[-]?\d{3,4}[-]?\d{3,4}|800\d[-]?\d{6}|400\d[-]?\d{6}|[+]?0?0?\d{2}[- ]?0\d{2,3}[- ）]?\d{7,8}[-]?\d{0,5}|0\d{2,3}[- ）]?\d{7,8}[-]?\d{0,5}|\d{7,8}[-\d]{0,5})'
telphonePattern=r'([+]?0?0?\d{2}[- ]?0\d{2,3}[- ）]?\d{7,8}[-]?\d{0,5}|0\d{2,3}[- ）]?\d{7,8}[-]?\d{0,5}|\d{7,8}[-\d]{0,5}|0\d{9,11})'

# 连续两个数字
lianxushuzi=r'(\d{2,8})'


temp=r'(-?\d{2,3})'


flagSplitPattern=r'，|:|!|,|;| |（|\(|\[|【|\d|　| '

#表示中文、其他字符
flag3class=ur'。|\?|!|,|;|、|……|…|\.\.\.|¨|‖|§|□|▲|●|↖|↗|↘|↙|∵|∴|∷|\||:|：|\\|是|为|即'
flag3classDel=ur'。|\?|!|,|;|、|……|…|\.\.\.|¨|‖|§|□|▲|●|↖|↗|↘|↙|∵|∴|∷|\||\\|是|为|即'
# 处理多义符
ambiguityFlag=ur'http:|https:|A:|Q:|q:|F:|T:|E:|V:'
address=u'Address|ADD|Add|通 讯 地 址|通讯地址|通 信 地 址|通信地址|联 系 地 址|联系地址|所 在 地|所在地|生 产 地|生产地|厂 址|厂址|基 地|地 址|地址'
telphone=u'F 号 码|F号码|fax 号 码|fax号码|傳 真 号 码|傳真号码|传 真 号 码|传真号码|tel 号 码|tel号码|telephone 号 码|telephone号码|T 号 码|T号码|总 机 号 码|总机号码|電 話 号 码|電話号码|座 机 号 码|座机号码|固 定 电 话|固定电话|固 话 号 码|固话号码|电 话 号 码|电话号码|F 号|F号|fax 号|fax号|傳 真 号|傳真号|传 真 号|传真号|tel 号|tel号|telephone 号|telephone号|T 号|T号|总 机 号|总机号|電 話 号|電話号|座 机 号|座机号|固 定 电 话 号|固定电话号|固 话 号|固话号|电 话 号|电话号|fax|傳 真|傳真|传 真|传真|tel|telephone|call|总 机|总机|電 話|電話|座 机|座机|固 定 电 话|固定电话|固 话|固话|电 话|电话|电：'
mobilphone=u'T 号 码|T号码|cel 号 码|cel号码|mob 号 码|mob号码|mobile 号 码|mobile号码|手 機 号 码|手機号码|移 动 号 码|移动号码|移 动 电 话 号 码|移动电话号码|手 机 号 码|手机号码|T 号|T号|cel 号|cel号|mob 号|mob号|mobile 号|mobile号|手 機 号|手機号|移 动 号|移动号|移 动 电 话 号|移动电话号|手 机 号|手机号|Ｔ：|cel|mob|mobile|手 機|手機|移 动|移动|移 动 电 话|移动电话|手 机|手机'
email=u'邮：|邮箱|邮 箱|电子信箱|电 子 信 箱|电子邮箱|电 子 邮 箱|电子邮件|电 子 邮 件|电邮|电 邮|郵箱|郵 箱|電郵|電 郵|E-mail|E-Mail|Email|Ｅ：|邮箱号码|邮 箱 号 码|电子信箱号码|电 子 信 箱 号 码|电子邮箱号码|电 子 邮 箱 号 码|电邮号码|电 邮 号 码|郵箱号码|郵 箱 号 码|電郵号码|電 郵 号 码|E-mail号码|E-mail 号 码|Email号码|Email 号 码|E号码|E 号 码|邮箱号|邮 箱 号|电子信箱号|电 子 信 箱 号|电子邮箱号|电 子 邮 箱 号|电邮号|电 邮 号|郵箱号|郵 箱 号|電郵号|電 郵 号|E-mail号|E-mail 号|Email号|Email 号|E号|E 号|e-mail|email'
weburl=u'网站|网 站|网址|网 址|官网|官 网|Web|web|WEB'
weichat=u'V：|wechat|微 信 公 众|微信公众|公 众|公众|微：|微 信|微信|号 码|号码|wechat 号 码|wechat号码|微 信 公 众 号 码|微信公众号码|公 众 号 码|公众号码|微 号 码|微号码|微 信 号 码|微信号码|V 号|V号|wechat 号|wechat号|微 信 公 众 号|微信公众号|公 众 号|公众号|微 号|微号|微 信 号|微信号'
qq=u'扣 号 码|扣号码|q 号 码|q号码|Q 号 码|Q号码|扣 扣 号 码|扣扣号码|qq 号 码|qq号码|QQ 号 码|QQ号码|扣 号|扣号|q 号|q号|Q 号|Q号|扣 扣 号|扣扣号|qq 号|qq号|QQ 号|QQ号|扣：|扣 扣|扣扣|q q|qq|Q Q|QQ'
linkman=u'专 线 号 码|专线号码|热 线 号 码|热线号码|联 系 我 们 的 号 码|联系我们的号码|联 系 人 的 号 码|联系人的号码|联 系 人 号 码|联系人号码|专 线 号|专线号|热 线 号|热线号|联 系 我 们 的 号|联系我们的号|联 系 人 的 号|联系人的号|联 系 人 号|联系人号|专 线|专线|热 线|热线|联 系 我 们 的|联系我们的|联 系 我 们|联系我们|联 系 人 的|联系人的|联 系 人|联系人'

domainSuffix=u'.ac|.ac.cn|.ah.cn|.at|.auto|.be|.berlin|.biz|.bj.cn|.bz|.ca|.cc|.club|.cn|.co|.co.uk|.com|.com.cn|.cq.cn|.de|.design|.es|.eu|.fj.cn|.gd.cn|.global|.gov.cn|.group|.gs|.gs.cn|.guru|.gx.cn|.gz.cn|.ha.cn|.hb.cn|.he.cn|.hi.cn|.hk.cn|.hl.cn|.hn.cn|.info|.ink|.io|.jl.cn|.jp|.js.cn|.jx.cn|.kim|.la|.life|.link|.ln.cn|.ltd|.me.uk|.media|.mn|.mo.cn|.mobi|.ms|.name|.net|.net.cn|.news|.nl|.nm.cn|.nx.cn|.online|.org|.org.cn|.org.uk|.photography|.pro|.qh.cn|.red|.ren|.rocks|.sc|.sc.cn|.sd.cn|.sh|.sh.cn|.shop|.site|.sn.cn|.solutions|.space|.store|.sx.cn|.tc|.tech|.tj.cn|.today|.top|.tv|.tw.cn|.us|.vegas|.vg|.vip|.wang|.website|.xin|.xj.cn|.xyz|.xz.cn|.yn.cn|.zj.cn|.佛山|.公司|.广东|.集团|.企业|.商标|.商城|.商店|.手机|.网店|.网络|.网址|.我爱你|.信息|.游戏|.娱乐|.在线|.中国|.中文网'

addressSuffix=u'#|北|层|城|档|东|栋|房|馆|号|甲|街|里|楼|路|门|南|弄|排|旁|室|西|巷|幢|座|区|仓库|场内|城区|大道|大厦|单元|对面|附近|广场|国道|国际|胡同|花园|楼下|路口|门面|前段|山庄|商场|商城|商铺|社区|市场|首层|巷内|小区|延段|园内|院内|中段|庄园|步行街|仓库内|产业园|创业园|工业港|工业区|工业园|交叉口|交汇处|开发区|科技园|批发城|商贸城|商贸园|商业街|物流园|斜对面|财富中心|孵化基地|号|商贸中心|物资大院|米|前行'

chineseData=u'一二三四五六七八九零'
arabicData=u'0123456789'


def isNumber(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是数字，false表示该对象不是数字
    '''
    string=string.strip()
    if string.isdigit():
        return True
    else:
        return False

def isNotLastLine(i,count):
    '''
    :param i:表示当前的行数
    :param count: 表示文档的总行数
    :return:true表示不是最后一行，false表示已经到最后一行
    '''
    if i<count-1:
        return True
    else:
        return False

#对文本进行处理将全角符号转成半角符号
# 一次转换一个字符
def strQ2B(uchar):
    # print uchar
    inside_code=ord(uchar)
    # print inside_code
    if inside_code == 12288 or inside_code == 160:                              #全角空格直接转换
        inside_code = 32
    elif (inside_code >= 65281 and inside_code <= 65374): #全角字符（除空格）根据关系转化
        inside_code -= 65248
    temp=unichr(inside_code)
    return temp

# --------------------------------unicode字符判断开始--------------------------------------
def is_chinese(uchar):
    """判断一个unicode是否是汉字"""
    if uchar >= u'\u4e00' and uchar<=u'\u9FCB':
        return True
    else:
        return False

def is_number(uchar):
    """判断一个unicode是否是数字"""
    if uchar >= u'\u0030' and uchar<=u'\u0039':
        return True
    else:
        return False

def is_alphabet(uchar):
    """判断一个unicode是否是英文字母"""
    if (uchar >= u'\u0041' and uchar<=u'\u005a') or (uchar >= u'\u0061' and uchar<=u'\u007a'):
        return True
    else:
        return False

def spaceBothside1_2(type,string1,string2):
    '''
    用于处理空格左右两边的字符是数值还是字母，并且处理一位或两位
    True表示第一类空格
    False表示第二类空格
    '''
    if type=='num':
        # 按照数值进行处理
        if is_number(string1[-1]) and is_number(string2[0]):
            if string1[-2:].isnumeric() or string2[:2].isnumeric():
                return True
            else:
                return False
        else:
            return False
    else:
    #     按字母进行处理
        if is_alphabet(string1[-1]) and is_alphabet(string2[0]):
            if string1[-2:].isalpha() or string2[:2].isalpha():
                return True
            else:
                return False
        else:
            return False

def spaceBothsideChinese(type,string1,string2):
    '''
        识别空格符左边是数字或字母，右边是汉字的；
        识别空格符左边是文字，右边是字母或数字的；
        :type用于控制判断方向
    '''
    if type=='R':
        if is_chinese(string2[0]) and (is_number(string1[-1]) or is_alphabet(string1[-1])):
            return True
        else:
            return False
    else:
        if is_chinese(string1[-1]) and (is_number(string2[0]) or is_alphabet(string2[0])):
            return True
        else:
            return False

def spaceBothNumOrChar(string1,string2):
    if (is_number(string1[-1]) and is_alphabet(string2[0])) or (is_number(string2[0]) and is_alphabet(string1[-1])):
        if string1[-2:].isalpha() or string1[-2:].isnumeric() or string2[:2].isalpha() or string2[:2].isnumeric():
            return True
        else:
            return False
    else:
        return False


def spaceBothHandle(one,two):
    if len(one.strip())==0:
        return two
    elif len(two.strip())==0:
        return one
    else:
        if (one[-1] in chineseData and two[0] in arabicData) or (one[-1] in arabicData and two[0] in chineseData):
            return one+two
        else:
            return one+" "+two

def spaceHandle(string):
    # 输入是utf-8;输出仍然是utf-8
    # utf-8编码转成unicode编码
    ustring=unicode(string,'utf-8')
    strList=ustring.split(" ")
    count=len(strList)
    if count<2:
        return string
    else:
        one=strList[0]
        for i in xrange(count-1):
            two=strList[i+1]
            one=spaceBothHandle(one,two)
        return one.encode("utf-8")


# --------------------------------unicode字符判断结束--------------------------------------

# --------------------------------判断分片类型---------------------------------------------
def isQq(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含qq，false表示该对象不包含
    '''
    if 'QQ' in string  and '@' not in string:
        return True
    else:
        return False

def isOther(string):
    #处理联系人信息
    if u'联系人' in string:
        return True
    else:
        return False

def isWeibo(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含weibo，false表示该对象不包含
    '''
    string=string.lower()
    if '微博' in string or 'weibo' in string:
        return True
    else:
        return False

def isWeichat(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含微信号，false表示该对象不包含
    '''
    if u'微信' in string:
        return True
    else:
        return False

def isEmail(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含email，false表示该对象不包含
    '''
    string=string.lower()
    if u'邮箱' in string:
        return True
    else:
        return False

def isAddress(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含地址，false表示该对象不包含
    '''
    #  or '中心' in string
    string=string.lower()
    if u'地址' in string:
        return True
    else:
        return False

def isMobilphoneNumber(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含weibo，false表示该对象不包含
    '''
    string=string.lower()
    if u'手机' in string:
        return True
    else:
        return False

def isTelphoneNumber(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含座机，false表示该对象不包含
    '''
    # temp=string.lower()
    if u'座机' in string:
        return True
    else:
        return False

def isUrl(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含url，false表示该对象不包含
    '''
    string=string.lower()
    if u'网址' in string:
        return True
    else:
        return False


def isContact(string):
    '''
    :param string: 待识别对象
    :return:true表示该对象是包含联系人，false表示该对象不包含
    '''
    string=string.lower()
    if '联系' in string or '热线' in string or '专线' in string:
        return True
    else:
        return False

def isCompanyName(string,obj,regionInfo):
    if len(string)>=8 and (obj.isIncludeSuffic(companySuffix['8'],string) or obj.isIncludeSuffic(companySuffix['7'],string) or obj.isIncludeSuffic(companySuffix['6'],string) or obj.isIncludeSuffic(companySuffix['5'],string) \
            or obj.isIncludeSuffic(companySuffix['4'],string) or obj.isIncludeSuffic(companySuffix['3'],string) or obj.isIncludeSuffic(companySuffix['2'],string)):

        if (obj.isIncludeRegion(regionInfo[u'省'],string) or obj.isIncludeRegion(regionInfo[u'市'],string) or obj.isIncludeRegion(regionInfo[u'县/区'],string)) and len(obj.outputCompanyName(string))>=8:
            return True
    return False



# ---------------------------------每一行内容类型进行判断----------------------------------

# ---------------------------判断联系人后面跟的是否是手机号或座机号--------------------------
def isIncludePhoneNumber(string):
    target=''
    for each in string:
        if each.isdigit():
            target=each
            break
    if target=='1':
        ind=string.index('1')
        res=string[ind:ind+11]
        if res.isdigit() and len(res)==11:
            return True
        else:
            return False
    else:
        return False


def isIncludeTelNumber(string):
    target=''
    for each in string:
        if each.isdigit():
            target=each
            break
    if target!='1':
        ind=string.index(target)
        res2=string[ind:ind+2]
        res3=string[ind:ind+3]
        if (res2.isdigit() and len(res2)>=2) or (res3.isdigit() and len(res3)>=3):
            return True
        else:
            return False
    else:
        return False


# ----------------------------------------识别结束----------------------------------------



'''
def isExist(string):
    if '零' in string or '壹' in string or '贰' in string or '叁' in string or '肆' in string or '伍' in string or '陆' in string \
            or '柒' in string or '捌' in string or '玖' in string or '一' in string or '二' in string or '三' in string or '四' in string \
            or '五' in string or '六' in string or '七' in string or '八' in string or '九' in string:
        return True
    else:
        return False
'''
def replacing(string):
    res=""
    for item in string:
        item1=strQ2B(item)    #全角转半角
        if item1 in gdict:
            res+=gdict[item1]     #中文数字替换
        elif item1 in ddict:
            res+=ddict[item1]     #汉字数据替换
        else:
            res+=item1.encode("utf-8")
    # print res
    res=res.lower()   #对英文大写进行处理
    jieguo=spaceHandle(res)       #对空格进行处理
    return jieguo

# -------------------------------文件夹开始-----------------------------------
def makeDir(targetDir,fileMd5):
    obj=os.path.join(targetDir,fileMd5)
    os.mkdir(obj)
# -------------------------------文件夹结束-----------------------------------

# 按照规则进行分行处理
def splitLine(string):
    result=[]
    temp=handleCommonWords(string)
    # res=temp.split(' ')   #按照空格进行分行
    res=re.split("\\t| ",temp)  #按照空格进行分行
    for each in res:
        linshi=each.strip()

        # print "------------------------------"
        # print type(linshi)
        # print "------------------------------"

        if len(linshi) == 0:
            continue
        else:
            guodu=handleChengdui(linshi,flagChengDui)
            result.append(guodu)
    return result


def handleCommonWords(string):
    #处理地址
    addString=handleCommonWord(string,address,u'地址')
    #处理邮箱
    emailString=handleCommonWord(addString,email,u'邮箱')
    #处理网址
    urlString=handleCommonWord(emailString,weburl,u'网址')
    #处理QQ
    qqString=handleCommonWord(urlString,qq,u'QQ')
    #处理手机
    phoneString=handleCommonWord(qqString,mobilphone,u'手机')
    #处理座机
    telString=handleCommonWord(phoneString,telphone,u'座机')
    #处理微信
    weichatstring=handleCommonWord(telString,weichat,u'微信')
    #处理微信
    res=handleCommonWord(weichatstring,linkman,u'联系人')

    return res

def handleCommonWord(string,targetFlag,replaceObj):
    if replaceObj==u'地址':
        jidiIndex=string.rfind(u'基地')
        jidiCount=string.count(u'基地')
        if (jidiCount==0) or (jidiCount==1 and jidiIndex>8):
            return re.sub(targetFlag,replaceObj,string)
        else:
            string1=string.replace(u'基地',u'地址',1)
            return re.sub(targetFlag,replaceObj,string1)
    else:
        return re.sub(targetFlag,replaceObj,string)

# ----------------------------------------------------
def handleChengduiAndOtherFlag(string):
    #处理成对符
    # string1=handleChengdui(string,flagChengDui)
    #处理其他符号、中文
    temp=re.findall(ambiguityFlag,string.lower())
    if len(temp)!=0:
        res=handleOtherFlag2Space(string,flag3classDel)
    else:
        res=handleOtherFlag2Space(string,flag3class)
    return res
# 将其他符号替换为空格
def handleOtherFlag2Space(string,flag):
   return re.sub(flag," ",string)
# 处理城对符
def handleChengdui(string,flag):

    for oneitem in flag:
        start=string.find(oneitem[0])
        end=string.find(oneitem[1],start+1)
        if start !=-1 and end !=-1:
            temp1=string[:start]
            temp2=string[start+1:end]
            temp3=string[end+1:]

            res=temp2+temp1+temp3
            return res
    return string

 # ------------------------------------------------
 # 去除常用词中间的空格
# ----------------------------------------------------
def delCommonWordsSpace(string,targetList):
    for item in targetList:
        if item !=None and ' ' in item and item in string:
            string=string.replace(item,item.replace(' ',''))
            break
        else:
            continue
    return string



class ZipUtilities:
    zip_file = None
    def __init__(self):
        self.zip_file = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED)
    def toZip(self, file, name):
        if os.path.isfile(file):
            self.zip_file.write(file, arcname=os.path.basename(file))
        else:
            self.addFolderToZip(file, name)
    def addFolderToZip(self, folder, name):
        for file in os.listdir(folder):
            full_path = os.path.join(folder, file)
            if os.path.isfile(full_path):
                self.zip_file.write(full_path, arcname=os.path.join(name, os.path.basename(full_path)))
            elif os.path.isdir(full_path):
                self.addFolderToZip(full_path, os.path.join(name, os.path.basename(full_path)))
    def close(self):
        if self.zip_file:
            self.zip_file.close()

def readTxtContent(fileList,type,fileMd5,targetFileHandle,workdir):
    target=fileMd5+type+'.txt'
    if target in fileList:
        targetFile=os.path.join(workdir,target)
        file=open(targetFile)
        res=file.readlines()
        if type=='companyName':
            for each in res:
                targetFileHandle.write(switchNum2Zhongwen(each))
        else:
            for each in res:
                targetFileHandle.write(each)
        targetFileHandle.write('\n')
        targetFileHandle.write('------------------------------------')
        targetFileHandle.write('\n')

def otherTempHandle(res,targetFile):
    if len(res)>0:
        for each in res:
            targetFile.write(each)
            targetFile.write('\n')
    else:
        return

def switchNum2Zhongwen(each):
    return each.replace('1',u'一').replace('2',u'二').replace('3',u'三').replace('4',u'四').replace('5',u'五').replace('6',u'六').replace('7',u'七').replace('8',u'八').replace('9',u'九')
